﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PersistenceLibrary.DataAccessObject;
using System.Xml.Linq;
using System.IO;
using ParasitoLibrary.Core.Entidade;

namespace ParasitoLibrary.DataAccess
{
    public abstract partial class DAOEntidadeParasitoAbstrata<Entidade> : DataAccessObjectAbstrato where Entidade : EntidadeParasitoAbstrata
    {        

        public virtual IList<Entidade> carregarEntidades(string caminhoArquivo)
        {
            XDocument xDocument = null;

            if (File.Exists(caminhoArquivo))
            {
                xDocument = XDocument.Load(@caminhoArquivo);
            }

            IList<Entidade> entidades = this.criarEntidades(xDocument);

            return entidades;
        }

        public IList<Entidade> criarEntidades(XDocument xDocument)
        {
            Entidade entidade = null;
            IList<Entidade> entidades = new List<Entidade>();
            Type typeNivel = typeof(Entidade);

            if (xDocument != null)
            {
                foreach (XElement xElement in xDocument.Descendants(typeNivel.Name.ToLower()))
                {
                    entidade = this.criarEntidade(xElement);                    
                    entidades.Add(entidade);
                }
            }

            return entidades;
        }

        public Entidade criarEntidade(XDocument xDocument)
        {
            Entidade entidade = null;            
            Type typeNivel = typeof(Entidade);

            if (xDocument != null)
            {
                entidade = this.criarEntidade(xDocument.Descendants(typeNivel.Name.ToLower()).Single());
            }

            return entidade;
        }

        public virtual IList<Entidade> carregarEntidades()
        {
            return this.carregarEntidades(this.getCaminhoArquivoXML());
        }

        public virtual Entidade consultarPorCodigo(string codigo)
        {
            IList<Entidade> listaEntidade = this.carregarEntidades();

            Entidade resultado = listaEntidade.Single(i => i.Codigo.Equals(codigo));

            return resultado;
        }

        public virtual void inserir(Entidade entidade)
        {
            XDeclaration declaracao = new XDeclaration("1.0", "iso-8859-1", "yes");
            XDocument documento = new XDocument(declaracao, entidade.toElementoXml());

            documento.Save(this.getDiretorioArquivosXML() + entidade.Codigo + ".xml");

        }

        public virtual void alterar(Entidade entidade)
        {
            XDeclaration declaracao = new XDeclaration("1.0", "iso-8859-1", "yes");
            XDocument documento = new XDocument(declaracao, entidade.toElementoXml());

            documento.Save(this.getDiretorioArquivosXML() + entidade.Codigo + ".xml");

        }

        public virtual void excluir(Entidade entidade)
        {
            string nomeArquivo = this.getDiretorioArquivosXML() + entidade.Codigo + ".xml";
            FileInfo arquivoQuestao = new FileInfo(@nomeArquivo);
            arquivoQuestao.Delete();
        }
        

        public abstract Entidade criarEntidade(XElement xElement);

        public abstract String getCaminhoArquivoXML();

        public abstract String getDiretorioArquivosXML();
    }
}
